package org.example.ai04.service;

import com.google.gson.Gson;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.example.ai04.dto.DeeseekRequest;
import org.example.ai04.dto.ResumeData;

import java.util.ArrayList;
import java.util.List;

/**
 * 简历分析服务类
 * 负责调用AI模型对简历数据进行智能分析，生成结构化的简历质量评估结果
 * 支持腾讯混元(hunyuan-lite)和DeepSeek(deepseek-chat)两种AI模型
 */
@Service
public class ResumeAnalysisService {
    
    // 日志记录器，用于记录服务运行过程中的关键信息、调试信息和错误
    private static final Logger logger = LoggerFactory.getLogger(ResumeAnalysisService.class);
    
    // Gson实例，用于JSON序列化和反序列化操作，处理API请求和响应数据
    private final Gson gson = new Gson();
    /**
     * 分析简历数据的主方法
     * 协调简历分析的完整流程：构建提示词、调用AI模型、解析响应结果
     * 
     * @param resumeData 简历数据对象，包含个人信息、教育经历、工作经历等完整内容
     * @param aiModel 要使用的AI模型名称，支持"hunyuan-lite"和默认的"deepseek-chat"
     * @return 简历分析结果，包含完整性检查、缺失部分、优化建议等信息
     * @throws UnirestException 当调用外部API发生异常时抛出（如网络问题、API超时等）
     */
    public ResumeData.ResumeAnalysis analyzeResume(ResumeData resumeData, String aiModel) throws UnirestException {
        // 第一步：构建用于AI分析的提示词，根据简历数据生成结构化的分析请求
        String prompt = buildSimplePrompt(resumeData);
        
        // 第二步：调用AI模型API获取分析结果，根据选择的模型配置不同的API参数
        String response = callAnalysisAPI(prompt, aiModel);
        
        // 第三步：解析AI返回的响应，提取结构化的分析结果
        return parseAnalysisResponse(response);
    }
    
    /**
     * 构建用于AI分析的提示词
     * 根据简历数据生成详细的分析请求，要求AI以固定JSON格式返回结果
     * 提示词设计遵循指令清晰、格式明确的原则，便于AI理解和生成预期输出
     * 
     * @param data 简历数据对象，包含完整的简历信息
     * @return 格式化的提示词字符串，包含角色设定、分析要求和预期输出格式
     */
    private String buildSimplePrompt(ResumeData data) {
        // 构建提示词，设定AI为HR专家，要求分析简历质量并按固定JSON格式返回
        return String.format("请作为HR专家，详细分析以下简历的质量。\n\n简历信息：\n姓名：%s\n邮箱：%s\n教育经历：%d项\n工作经历：%d项\n技能：%d项\n\n请返回完整的JSON格式分析结果：\n{\n  \"isComplete\": true/false,\n  \"missingSections\": [\"缺失的模块\"],\n  \"gaps\": [\"时间断层\"],\n  \"suggestions\": [\"具体优化建议\"],\n  \"overallScore\": \"A/B/C/D\",\n  \"analysisSummary\": \"100字内的总结\"\n}\n\n简历内容：%s\n\n请严格按JSON格式返回，不要添加其他文字。", 
            data.getName(), data.getEmail(), 
            data.getEducation() != null ? data.getEducation().size() : 0,
            data.getWorkExperience() != null ? data.getWorkExperience().size() : 0,
            data.getSkills() != null ? data.getSkills().size() : 0,
            data.getSummary());
    }
    
    /**
     * 调用AI模型API进行简历分析
     * 根据选择的模型配置不同的API参数，并发送HTTP请求获取AI响应
     * 支持腾讯混元和DeepSeek两种主流AI模型的API调用
     * 
     * @param prompt 分析提示词，包含详细的分析要求
     * @param aiModel AI模型名称，指定使用的AI服务
     * @return AI模型的原始响应字符串
     * @throws UnirestException 当HTTP请求失败时抛出（如网络连接问题、服务器错误等）
     */
    private String callAnalysisAPI(String prompt, String aiModel) throws UnirestException {
        // 第一步：根据选择的模型配置不同的API参数
        String apiKey, apiUrl, modelName;
        
        // 腾讯混元模型配置
        if ("hunyuan-lite".equals(aiModel)) {
            apiKey = "sk-uVfDzLm7SdZ80fNFcywGxUt9vTWau6kkAaMHcnxcI9ClRG1n";
            apiUrl = "https://api.hunyuan.cloud.tencent.com/v1/chat/completions";
            modelName = "hunyuan-lite";
        } else {
            // 默认使用DeepSeek模型
            apiKey = "sk-9483d697aaa0459591f6116e2c930265";
            apiUrl = "https://api.deepseek.com/v1/chat/completions";
            modelName = "deepseek-chat";
        }
        
        // 第二步：构建符合OpenAI API格式的请求体（标准的Chat Completion格式）
        String json = gson.toJson(DeeseekRequest.builder()
            .model(modelName)  // 指定使用的模型名称
            .messages(List.of(
                // 系统角色消息，设定AI为HR专家
                DeeseekRequest.Message.builder().role("system").content("HR专家").build(),
                // 用户角色消息，包含分析提示词
                DeeseekRequest.Message.builder().role("user").content(prompt).build()
            ))
            .build());
        
        // 第三步：发送HTTP POST请求到AI API，并返回响应体
        return Unirest.post(apiUrl)
            .header("Content-Type", "application/json")  // 设置请求内容类型为JSON
            .header("Authorization", "Bearer " + apiKey)  // 设置授权头部，包含API密钥
            .body(json)  // 设置请求体内容
            .asString()  // 以字符串形式获取响应
            .getBody();  // 提取响应体内容
    }
    
    /**
     * 解析AI模型返回的响应，提取结构化的简历分析结果
     * 处理各种可能的响应格式，并在解析失败时提供默认结果，确保系统稳定性
     * 包含多层容错机制，适应不同AI模型可能返回的格式差异
     * 
     * @param response AI模型的原始响应字符串
     * @return 结构化的简历分析结果对象
     */
    private ResumeData.ResumeAnalysis parseAnalysisResponse(String response) {
        try {
            // 第一步：处理LLM标准响应格式（ChatCompletion格式）
            String jsonContent = response;
            
            // 如果响应包含"choices"字段，表示是标准的ChatCompletion格式
            if (response.contains("choices")) {
                com.google.gson.JsonObject responseObj = gson.fromJson(response, com.google.gson.JsonObject.class);
                if (responseObj.has("choices") && responseObj.getAsJsonArray("choices").size() > 0) {
                    com.google.gson.JsonObject choice = responseObj.getAsJsonArray("choices").get(0).getAsJsonObject();
                    if (choice.has("message") && choice.getAsJsonObject("message").has("content")) {
                        // 提取AI生成的内容
                        jsonContent = choice.getAsJsonObject("message").get("content").getAsString();
                    }
                }
            }
            
            // 第二步：提取JSON对象内容（处理AI可能返回的额外文本）
            int startIndex = jsonContent.indexOf("{");
            int endIndex = jsonContent.lastIndexOf("}") + 1;
            if (startIndex != -1 && endIndex != -1) {
                // 截取JSON对象部分，去除可能的前缀和后缀文本
                jsonContent = jsonContent.substring(startIndex, endIndex);
            }
            
            // 第三步：将JSON字符串解析为ResumeAnalysis对象
            ResumeData.ResumeAnalysis analysis = gson.fromJson(jsonContent, ResumeData.ResumeAnalysis.class);
            
            // 第四步：确保返回有效对象
            if (analysis == null) {
                throw new RuntimeException("解析结果为null");
            }
            
            return analysis;
            
        } catch (Exception e) {
            // 异常处理：记录解析失败的错误信息
            logger.error("简历分析解析失败: {}", e.getMessage());
            
            // 当解析失败时，返回默认的分析结果，确保系统能够正常运行
            return ResumeData.ResumeAnalysis.builder()
                .isComplete(false)
                .missingSections(List.of("无法自动分析"))
                .gaps(new ArrayList<>())
                .suggestions(List.of("请检查简历格式是否规范", "确保包含完整的教育和工作经历"))
                .overallScore("-")
                .analysisSummary("分析过程中出现问题，请重试")
                .build();
        }
    }
}